home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / graph2.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  28KB  |  969 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  graph2.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_GRAPH1_H
  16. #define LEDA_GRAPH1_H
  17.  
  18. //------------------------------------------------------------------------------
  19. //   directed graphs
  20. //------------------------------------------------------------------------------
  21.  
  22.  
  23. #include <LEDA/basic.h>
  24. #include <LEDA/list.h>
  25. #include <LEDA/impl/olist.h>
  26.  
  27.  
  28. class node_struct;
  29. typedef node_struct* node;
  30.  
  31. class edge_struct;
  32. typedef edge_struct* edge;
  33.  
  34.  
  35. class node_link_struct : public obj_link {};
  36. typedef node_link_struct* node_link;
  37.  
  38. class edge_link_struct : public obj_link {};
  39. typedef edge_link_struct* edge_link;
  40.  
  41. class aux_link_struct : public obj_link {};
  42. typedef aux_link_struct* aux_link;
  43.  
  44.  
  45. typedef int  (*cmp_graph_node) (node&, node&);
  46. typedef int  (*cmp_graph_edge) (edge&, edge&);
  47.  
  48.  
  49. //------------------------------------------------------------------------------
  50. // class node_struct: internal representation of nodes
  51. //------------------------------------------------------------------------------
  52.  
  53. class node_struct : public aux_link_struct, 
  54.                     public node_link_struct
  55. {  
  56.    friend class graph;
  57.    friend class ugraph;
  58.    friend class planar_map;
  59.    friend class node_data;
  60.    friend class node_stack;
  61.    friend class node_queue;
  62.    friend class node_list;
  63.    friend class node_pq;
  64.    friend class node_bucket_pq;
  65.  
  66.    
  67.    graph*   g;            // pointer to graph of node 
  68.    int      name;         // internal name (index)  
  69.    obj_list adj_edges;    // lists of adjacent edges
  70.    int      indegree;
  71.  
  72. public:
  73.  
  74.    GenPtr data[3];      // data[0] used by GRAPH
  75.                         // data[1] in node_stack, node_queue, node_pq, etc.
  76.                         // data[2] used by node_data
  77.  
  78.  
  79. node_struct(GenPtr i=0) { data[0] = i; name = -1; g = 0; indegree=0; }
  80.  
  81. LEDA_MEMORY(node_struct)
  82.  
  83. FRIEND_INLINE graph* graph_of(node);
  84. FRIEND_INLINE graph* graph_of(edge);
  85. FRIEND_INLINE int    indeg(node);
  86. FRIEND_INLINE int    outdeg(node);
  87. FRIEND_INLINE int    degree(node);
  88. FRIEND_INLINE int    index(node);
  89.  
  90. FRIEND_INLINE edge First_Adj_Edge(node);
  91. FRIEND_INLINE edge Last_Adj_Edge(node);
  92.  
  93. FRIEND_INLINE void start_adj_iteration(node);
  94. FRIEND_INLINE void move_to_adj_succ(node);
  95. FRIEND_INLINE bool read_adj_node(node&,node);
  96. FRIEND_INLINE bool read_adj_edge(edge&,node);
  97.  
  98. friend void init_node_data1(const graph&,GenPtr);
  99. friend void init_node_data2(const graph&,GenPtr);
  100.  
  101. };
  102.  
  103.  
  104.  
  105. //------------------------------------------------------------------------------
  106. // class edge_struct: internal representation of edges
  107. //------------------------------------------------------------------------------
  108.  
  109. class adj_link_struct1 : public obj_link 
  110. {
  111.    friend class graph;
  112.    friend class ugraph;
  113.    friend class planar_map;
  114.  
  115.  protected:
  116.  
  117.    int  name;          // internal name (index)  
  118.    node s;             // source node 
  119.    node t;             // target node
  120.  
  121.    LEDA_MEMORY(adj_link_struct1)
  122.  
  123.    adj_link_struct1() { name = -1; }
  124.  
  125.  };
  126.  
  127. typedef adj_link_struct1* adj_link1;
  128.  
  129.  
  130. class edge_struct : public adj_link_struct1, 
  131.                     public edge_link_struct
  132.    
  133.    friend class graph;
  134.    friend class ugraph;
  135.    friend class planar_map;
  136.    friend class edge_data;
  137.  
  138.    edge rev;     // reverse edge (for ugraph/planar_map)
  139.  
  140. public:
  141.  
  142.    GenPtr data[1];     // space for data data[0] used by GRAPH!)
  143.                        //                data[1] by edge_data
  144.  
  145.  
  146. edge_struct(node v, node w, GenPtr i=0)
  147. { data[0] = i;
  148.   name = -1;
  149.   s = v;
  150.   t = w;
  151.   rev = nil;
  152. }
  153.  
  154. LEDA_MEMORY(edge_struct)
  155.  
  156. FRIEND_INLINE graph* graph_of(edge);
  157. FRIEND_INLINE node   source(edge);
  158. FRIEND_INLINE node   target(edge);
  159. FRIEND_INLINE int    index(edge);
  160.  
  161. FRIEND_INLINE bool read_adj_node(node&,node);
  162.  
  163. FRIEND_INLINE void init_edge_data(const graph&,int,GenPtr);
  164.  
  165. };
  166.  
  167.  
  168. inline int    outdeg(node v) { return v->adj_edges.length(); }
  169. inline int    indeg(node v)  { return v->indegree; }
  170. inline int    degree(node v) { return outdeg(v); }
  171.  
  172. inline int     index(node v)  { return v->name;    }
  173. inline graph*  graph_of(node v) { return v->g; }
  174.  
  175. inline graph* graph_of(edge e) { return e->s->g;   }
  176. inline node   source(edge e)   { return e->s;      }
  177. inline node   target(edge e)   { return e->t;      }
  178. inline int    index(edge e)    { return e->name;    }
  179.  
  180.  
  181. inline edge First_Adj_Edge(node v)  
  182. { return edge(adj_link1(v->adj_edges.first())); }
  183.  
  184. inline edge Last_Adj_Edge(node v)  
  185. { return edge(adj_link1(v->adj_edges.last())); }
  186.  
  187. inline edge Succ_Adj_Edge(edge e) 
  188. { return edge(adj_link1(adj_link1(e)->succ_item()));}
  189.  
  190. inline edge Pred_Adj_Edge(edge e) 
  191. { return edge(adj_link1(adj_link1(e)->pred_item()));}
  192.  
  193. inline void start_adj_iteration(node v) { v->adj_edges.start_iteration(); }
  194.  
  195. inline void move_to_adj_succ(node v) { v->adj_edges.move_to_succ(); }
  196.  
  197. inline bool read_adj_edge(edge& e, node v)
  198. { obj_link* p = v->adj_edges.read_iterator();
  199.   if (p) { e = edge(adj_link1(p)); return true; }
  200.   else return false;
  201.  }
  202.  
  203. inline bool read_adj_node(node& u, node v)
  204. { obj_link* p = v->adj_edges.read_iterator();
  205.   if (p) { u = edge(adj_link1(p))->t; return true; }
  206.   else return false;
  207.  }
  208.  
  209.  
  210.  
  211. //------------------------------------------------------------------------------
  212. // graph_array<node/edge>
  213. //
  214. // base class for node and edge arrays
  215. //
  216. //------------------------------------------------------------------------------
  217.  
  218. template <class itype>
  219.  
  220. class _CLASSTYPE graph_array {
  221.  
  222. graph* g;     // array is declared for graph *g 
  223.  
  224. int mx_i;    // maximal node index in g at time of creation
  225.  
  226. protected:
  227.  
  228. GenPtr* arr;  
  229.  
  230. virtual void clear_entry(GenPtr&) const {}
  231. virtual void copy_entry(GenPtr&)  const {}
  232.  
  233. public:
  234.  
  235. virtual int cmp_entry(itype,itype) const  { return 0; }
  236.  
  237.  GenPtr& entry(itype x)
  238.  { if (g != graph_of(x) || index(x) > mx_i)
  239.           error_handler(102,"(node/edge)_array[x]: not defined for x");
  240.   return arr[index(x)];
  241.  }
  242.  
  243.  GenPtr  inf(itype x) const
  244.  { if (g != graph_of(x) || index(x) > mx_i)
  245.           error_handler(102,"(node/edge)_array[x]: not defined for x");
  246.   return arr[index(x)];
  247.  }
  248.  
  249.  GenPtr& entry(int i) { return arr[i]; }
  250.  
  251.  void init(const graph&, int, GenPtr);
  252.  void init(const graph_array<itype>&);
  253.  
  254.  void clear();
  255.  int  size() const     { return mx_i+1;}
  256.  
  257.  graph_array() { g = 0; mx_i = -1; arr = 0;}
  258.  
  259.  virtual ~graph_array() { clear(); }
  260.  
  261. };
  262.  
  263.  
  264. //------------------------------------------------------------------------------
  265. // graph: base class for all graphs
  266. //------------------------------------------------------------------------------
  267.  
  268. class graph {
  269.  
  270. friend class ugraph;
  271. friend class planar_map;
  272. friend class graph_array<node>; 
  273. friend class graph_array<edge>; 
  274.  
  275. //list<node> V;              /* list of all nodes */
  276. obj_list V;
  277.  
  278. //list<edge> E;              /* list of all edges */
  279. obj_list E;
  280.  
  281. int max_n_index;      // maximal node index 
  282. int max_e_index;      // maximal edge index
  283.  
  284. bool   undirected;       // true iff graph undirected
  285.  
  286.  
  287. /* space: 2 lists + 4 words + "virtual" = 2*20 + 5*4 bytes = 60 bytes */
  288.  
  289. virtual void init_node_entry(GenPtr& x)  { x=0; }
  290. virtual void init_edge_entry(GenPtr& x)  { x=0; }
  291.  
  292. virtual void copy_node_entry(GenPtr&) const {}
  293. virtual void copy_edge_entry(GenPtr&) const {}
  294.  
  295. virtual void clear_node_entry(GenPtr& x) const { x=0; }
  296. virtual void clear_edge_entry(GenPtr& x) const { x=0; }
  297.  
  298. virtual void read_node_entry(istream& in, GenPtr& x)  { Read(x,in); }
  299. virtual void read_edge_entry(istream& in, GenPtr& x)  { Read(x,in); }
  300.  
  301. virtual void write_node_entry(ostream& o, GenPtr& x)  const { Print(x,o); }
  302. virtual void write_edge_entry(ostream& o, GenPtr& x)  const { Print(x,o); }
  303.  
  304. virtual void print_node_entry(ostream&, GenPtr&)  const {}
  305. virtual void print_edge_entry(ostream&, GenPtr&)  const {}
  306.  
  307. virtual char* node_type()  const { return "void"; }
  308. virtual char* edge_type()  const { return "void"; }
  309.  
  310. protected:
  311.  
  312. graph* parent;           // for subgraphs
  313.  
  314. void copy_all_entries() const;
  315. void clear_all_entries() const;
  316.  
  317. public:
  318.  
  319. virtual int cmp_node_entry(node, node) const { return 0; }
  320. virtual int cmp_edge_entry(edge, edge) const { return 0; }
  321.  
  322.    int  space() const;
  323.    void reset() const;
  324.  
  325.  
  326.    int  indeg(node v)     const;
  327.    int  outdeg(node v)    const;
  328.    int  degree(node v)    const;
  329.    node source(edge e)    const;
  330.    node target(edge e)    const;
  331.  
  332.    graph* super()        const;
  333.  
  334.    int max_i(node)       const;
  335.    int max_i(edge)       const;
  336.    int max_node_index()  const;
  337.    int max_edge_index()  const;
  338.  
  339.    int  number_of_nodes() const;
  340.    int  number_of_edges() const;
  341.  
  342.    list<edge> all_edges()     const;
  343.    list<node> all_nodes()     const;
  344.    list<edge> adj_edges(node) const;
  345.    list<node> adj_nodes(node) const;
  346.  
  347.    GenPtr& entry(node v);
  348.    GenPtr& entry(edge e);
  349.    GenPtr  inf(node v) const;
  350.    GenPtr  inf(edge e) const;
  351.  
  352. int int_inf(edge e) { return int(e->data[0]); }
  353.  
  354.  
  355.    edge first_adj_edge(node v) const;
  356.    //edge first_in_edge(node v)  const;
  357.    edge last_adj_edge(node v)  const;
  358.    //edge last_in_edge(node v)   const;
  359.  
  360.    void init_adj_iterator(node v)        const;
  361.    edge next_adj_edge(edge& e,node v)    const;
  362.    bool current_adj_edge(edge& e,node v) const;
  363.    bool next_adj_node(node& w,node v)    const;
  364.    bool current_adj_node(node& w,node v) const;
  365.  
  366.    void init_node_iterator() const {}
  367.    void init_edge_iterator() const {}
  368.    
  369.    node first_node()      const;
  370.    edge first_edge()      const;
  371.    node last_node()       const;
  372.    edge last_edge()       const;
  373.    node choose_node()     const;
  374.    edge choose_edge()     const;
  375.    node succ_node(node v) const;
  376.    node pred_node(node v) const;
  377.    edge succ_edge(edge e) const;
  378.    edge pred_edge(edge e) const;
  379.    edge adj_succ(edge e)  const;
  380.    edge adj_pred(edge e)  const;
  381.    edge cyclic_adj_succ(edge e) const;
  382.    edge cyclic_adj_pred(edge e) const;
  383.  
  384. protected:
  385.  
  386.    node new_node(GenPtr);
  387.    edge new_edge(node, node, GenPtr);
  388.    edge new_edge(edge, node, GenPtr, int dir);
  389.  
  390.    void assign(node v,GenPtr x);
  391.    void assign(edge e,GenPtr x);
  392.  
  393. public:
  394.  
  395.    node new_node()   { GenPtr x; init_node_entry(x);  
  396.                        return new_node(x); }
  397.  
  398.    edge new_edge(node v, node w) 
  399.    { GenPtr x; init_edge_entry(x);
  400.      return new_edge(v,w,x);}
  401.  
  402.    edge new_edge(edge e, node w, int dir=0) 
  403.    { GenPtr x; init_edge_entry(x);
  404.      return new_edge(e,w,x,dir); }
  405.  
  406.    void del_node(node);
  407.    void del_edge(edge);
  408.    void del_all_nodes(); 
  409.    void del_all_edges(); 
  410.  
  411.    list<edge> insert_reverse_edges();
  412.  
  413.    void sort_nodes(cmp_graph_node);
  414.    void sort_edges(cmp_graph_edge);
  415.  
  416.    void sort_nodes(const graph_array<node>&);
  417.    void sort_edges(const graph_array<edge>&);
  418.  
  419.    void sort_edges();
  420.    void sort_nodes();
  421.  
  422.    edge rev_edge(edge);
  423.    graph& rev();
  424.  
  425.    void make_directed();
  426.    void make_undirected();
  427.  
  428.    void write(ostream& = cout) const;
  429.    void write(string) const;
  430.  
  431.    int  read(istream& = cin);
  432.    int  read(string);
  433.  
  434.    void print_node(node,ostream& = cout)  const;
  435.  
  436. virtual void print_edge(edge,ostream& = cout)  const;  //different for ugraph's
  437.  
  438.    void print(string s, ostream& = cout) const;
  439.  
  440.    void print()           const { print("");   }
  441.    void print(ostream& o) const { print("",o); }
  442.  
  443.    void clear();
  444.  
  445.    graph();
  446.    graph(const graph&);
  447.    graph& operator=(const graph&); 
  448.  
  449.   virtual ~graph(){ clear(); }
  450.  
  451.  
  452.    //subgraph constructors
  453.  
  454.    graph(graph&, const list<node>&, const list<edge>&);
  455.    graph(graph&, const list<edge>&);
  456.  
  457. };
  458.  
  459. inline int  graph::outdeg(node v) const { return v->adj_edges.length(); }
  460. inline int  graph::indeg(node v)  const { return v->indegree; }
  461. inline int  graph::degree(node v) const { return outdeg(v); }
  462.  
  463. inline node graph::source(edge e)    const   { return e->s; }
  464. inline node graph::target(edge e)    const   { return e->t; }
  465.  
  466. inline graph* graph::super()       const   { return parent; }
  467. inline int graph::max_i(node)      const   { return max_n_index; }
  468. inline int graph::max_i(edge)      const   { return max_e_index; }
  469. inline int graph::max_node_index() const   { return max_n_index; }
  470. inline int graph::max_edge_index() const   { return max_e_index; }
  471.  
  472. inline int  graph::number_of_nodes() const   { return V.length(); }
  473. inline int  graph::number_of_edges() const   { return E.length(); }
  474.  
  475. inline GenPtr& graph::entry(node v)        { return v->data[0]; }
  476. inline GenPtr& graph::entry(edge e)        { return e->data[0]; }
  477. inline void graph::assign(node v,GenPtr x) { v->data[0] = x; }
  478. inline void graph::assign(edge e,GenPtr x) { e->data[0] = x; }
  479.  
  480. inline GenPtr  graph::inf(node v) const { return v->data[0]; }
  481. inline GenPtr  graph::inf(edge e) const { return e->data[0]; }
  482.  
  483. inline edge graph::first_adj_edge(node v) const
  484. { return edge(adj_link1(v->adj_edges.first())); }
  485.  
  486. inline edge graph::last_adj_edge(node v)  const
  487. { return edge(adj_link1(v->adj_edges.last())); }
  488.  
  489.  
  490. inline void graph::init_adj_iterator(node v) const 
  491. { v->adj_edges.set_iterator(nil); }
  492.  
  493. inline bool  graph::current_adj_edge(edge& e,node v) const 
  494. { return (e = edge(adj_link1(v->adj_edges.read_iterator()))) != nil;}
  495.  
  496. inline edge  graph::next_adj_edge(edge& e,node v) const 
  497. { obj_link* it = v->adj_edges.read_iterator(); 
  498.   obj_link* p =  it ? v->adj_edges.move_to_succ() 
  499.                  : v->adj_edges.start_iteration(); 
  500.   return  e = edge(adj_link1(p));
  501.  }
  502.  
  503. inline bool graph::next_adj_node(node& w,node v)  const
  504. { edge e;
  505.   if (next_adj_edge(e,v))
  506.   { //w = (v==e->s) ? e->t : e->s;  // ugraph
  507.     w = e->t;
  508.     return true; 
  509.    }
  510.   else return false;
  511.  }
  512.    
  513. inline bool graph::current_adj_node(node& w,node v)  const
  514. { edge e;
  515.   if (current_adj_edge(e,v))
  516.   { //w = (v==e->s) ? e->t : e->s;  // ugraph
  517.     w = e->t;
  518.     return true; 
  519.    }
  520.   else return false;
  521. }
  522.    
  523.  
  524. inline node graph::first_node()   const { return node(node_link(V.first())); }
  525. inline node graph::last_node()    const { return node(node_link(V.last())); }
  526. inline node graph::choose_node()  const { return first_node(); }
  527.  
  528. inline edge graph::first_edge()   const { return edge(edge_link(E.first())); }
  529. inline edge graph::last_edge()    const { return edge(edge_link(E.last())); }
  530. inline edge graph::choose_edge()  const { return first_edge(); }
  531.  
  532. inline node graph::succ_node(node v)  const  
  533. { return node(node_link(V.succ(node_link(v)))); }
  534.  
  535. inline node graph::pred_node(node v)  const  
  536. { return node(node_link(E.pred(node_link(v)))); }
  537.  
  538. inline edge graph::succ_edge(edge e)  const  
  539. { return edge(edge_link(E.succ(edge_link(e)))); }
  540.  
  541. inline edge graph::pred_edge(edge e)  const  
  542. { return edge(edge_link(E.pred(edge_link(e)))); }
  543.  
  544. inline edge graph::adj_succ(edge e)  const
  545. { return edge(adj_link1(adj_link1(e)->succ_item())); }
  546.  
  547. inline edge graph::adj_pred(edge e)  const
  548. { return edge(adj_link1(adj_link1(e)->pred_item())); }
  549.  
  550. inline edge graph::cyclic_adj_succ(edge e) const 
  551. { return (e = adj_succ(e)) ? e : first_adj_edge(e->s); }
  552.  
  553. inline edge graph::cyclic_adj_pred(edge e) const 
  554. { return (e = adj_pred(e)) ? e : last_adj_edge(e->s); }
  555.  
  556. //------------------------------------------------------------------------------
  557. // Iteration   (macros)
  558. //------------------------------------------------------------------------------
  559.  
  560. #define forall_nodes(v,g) for (v=(g).first_node(); v; v=(g).succ_node(v) )
  561. #define forall_edges(e,g) for (e=(g).first_edge(); e; e=(g).succ_edge(e) )
  562.  
  563. #define Forall_nodes(v,g) for (v=(g).last_node(); v; v=(g).pred_node(v) )
  564. #define Forall_edges(e,g) for (e=(g).last_edge(); e; e=(g).pred_edge(e) )
  565.  
  566.  
  567. #define forall_adj_edges(e,v) for(e = First_Adj_Edge(v);e;e = Succ_Adj_Edge(e))
  568.  
  569. #define forall_out_edges(e,v) forall_adj_edges(e,v)
  570.  
  571. #define forall_in_edges(e,v) while(false)
  572.  
  573.  
  574. #define forall_adj_nodes(u,v)\
  575. for(start_adj_iteration(v); read_adj_node(u,v); move_to_adj_succ(v))
  576.  
  577.  
  578.  
  579. //------------------------------------------------------------------------------
  580. // GRAPH<vtype,etype> : parameterized directed graphs
  581. //------------------------------------------------------------------------------
  582.  
  583.  
  584. template<class vtype, class etype> 
  585.  
  586. class _CLASSTYPE GRAPH : public graph {
  587.  
  588. vtype X;
  589. etype Y;
  590.  
  591. void copy_node_entry(GenPtr& x) const  { x=Copy(ACCESS(vtype,x)); }
  592. void copy_edge_entry(GenPtr& x) const  { x=Copy(ACCESS(etype,x)); }
  593.  
  594. void clear_node_entry(GenPtr& x) const { Clear(ACCESS(vtype,x)); }
  595. void clear_edge_entry(GenPtr& x) const { Clear(ACCESS(etype,x)); }
  596.  
  597. void write_node_entry(ostream& o, GenPtr& x) const {Print(ACCESS(vtype,x),o);}
  598. void write_edge_entry(ostream& o, GenPtr& x) const {Print(ACCESS(etype,x),o);}
  599.  
  600. void read_node_entry(istream& i, GenPtr& x) { Read(X,i); x=Copy(X); }
  601. void read_edge_entry(istream& i, GenPtr& x) { Read(Y,i); x=Copy(Y); }
  602.  
  603. void init_node_entry(GenPtr& x) { Init(X); x = Copy(X); }
  604. void init_edge_entry(GenPtr& x) { Init(Y); x = Copy(Y); }
  605.  
  606. void print_node_entry(ostream& o, GenPtr& x)  const
  607.      { o << "("; Print(ACCESS(vtype,x),o); o << ")"; }
  608. void print_edge_entry(ostream& o, GenPtr& x)  const
  609.      { o << "("; Print(ACCESS(etype,x),o); o << ")"; }
  610.  
  611. char* node_type()  const { return TYPE_NAME(vtype); }
  612. char* edge_type()  const { return TYPE_NAME(etype); }
  613.  
  614. public:
  615.  
  616. int cmp_node_entry(node x, node y) const { return compare(inf(x),inf(y)); }
  617. int cmp_edge_entry(edge x, edge y) const { return compare(inf(x),inf(y)); }
  618.  
  619. vtype  inf(node v)    const   { return ACCESS(vtype,graph::inf(v)); }
  620. etype  inf(edge e)    const   { return ACCESS(etype,graph::inf(e)); }
  621.  
  622. vtype& operator[] (node v)    { return ACCESS(vtype,entry(v)); }
  623. etype& operator[] (edge e)    { return ACCESS(etype,entry(e)); }
  624. vtype  operator[] (node v) const   { return ACCESS(vtype,graph::inf(v)); }
  625. etype  operator[] (edge e) const   { return ACCESS(etype,graph::inf(e)); }
  626.  
  627. void   assign(node v,vtype x) { operator[](v) = x; }
  628. void   assign(edge e,etype x) { operator[](e) = x; }
  629.  
  630. node   new_node()               { return graph::new_node(); }
  631. node   new_node(vtype a)        { return graph::new_node(Copy(a)); }
  632.  
  633. edge   new_edge(node v, node w) { return graph::new_edge(v,w); }
  634. edge   new_edge(node v, node w, etype a)
  635.                                 { return graph::new_edge(v,w,Copy(a)); }
  636. edge   new_edge(edge e, node w) { return graph::new_edge(e,w); }
  637. edge   new_edge(edge e, node w, etype a)
  638.                                 { return graph::new_edge(e,w,Copy(a),0); }
  639. edge   new_edge(edge e, node w, etype a, int dir)
  640.                                 { return graph::new_edge(e,w,Copy(a),dir); }
  641.  
  642. void   clear()                  { clear_all_entries(); graph::clear(); }
  643.  
  644. GRAPH<vtype,etype>& operator=(const GRAPH<vtype,etype>& a)
  645. { clear_all_entries();graph::operator=(a);copy_all_entries();return *this; }
  646.  
  647. GRAPH()  {}
  648. GRAPH(const GRAPH<vtype,etype>& a) : graph(a) { a.copy_all_entries(); } 
  649.  
  650. /* subgraphs */
  651. GRAPH(GRAPH<vtype,etype>& a, const list<node>& b, const list<edge>& c) 
  652.                                                   : graph(a,b,c) {}
  653.  
  654. GRAPH(GRAPH<vtype,etype>& a, const list<edge>& c) : graph(a,c) {}
  655.  
  656. virtual ~GRAPH()   { if (parent==0) clear_all_entries(); }
  657.  
  658. };
  659.  
  660.  
  661.  
  662. //------------------------------------------------------------------------------
  663. // node_list
  664. //------------------------------------------------------------------------------
  665.  
  666. class node_list : public c_obj_list
  667. {
  668.   node iterator;
  669.  
  670. public:
  671.  
  672.   static void del_node(node v) { aux_link(v)->del_item(); }
  673.  
  674.   void append(node v) { c_obj_list::append(aux_link(v)); }
  675.   void push(node v)   { c_obj_list::push(aux_link(v)); }
  676.   void insert(node v, node w) 
  677.                       { c_obj_list::insert(aux_link(v),aux_link(w)); }
  678.   node pop()          { return node(aux_link(c_obj_list::pop())); }
  679.   void del(node v)    { c_obj_list::del(aux_link(v)); }
  680.  
  681.   bool member(node v)  const { return aux_link(v)->succ_link != nil; }
  682.   bool operator()(node v) const { return member(v); }
  683.  
  684.   node first()const { return node(aux_link(c_obj_list::first())); }
  685.   node last() const { return node(aux_link(c_obj_list::last()));  }
  686.   node head() const { return node(aux_link(c_obj_list::first())); }
  687.   node tail() const { return node(aux_link(c_obj_list::last()));  }
  688.  
  689.   node succ(node v) const
  690.   { return node(aux_link(c_obj_list::succ(aux_link(v)))); }
  691.  
  692.   node pred(node v) const
  693.   { return node(aux_link(c_obj_list::pred(aux_link(v)))); }
  694.  
  695.   node cyclic_succ(node v) const
  696.   { return node(aux_link(c_obj_list::cyclic_succ(aux_link(v)))); }
  697.  
  698.   node cyclic_pred(node v) const
  699.   { return node(aux_link(c_obj_list::cyclic_pred(aux_link(v)))); }
  700.  
  701.   void start_iteration() const { (*(node*)&iterator)=first(); }
  702.   void move_to_succ() const { (*(node*)&iterator) = succ(iterator);}
  703.  
  704.   bool read_iterator(node& x) const { x = iterator; return x ? true : false; }
  705.  
  706. };
  707.  
  708.  
  709.  
  710. //------------------------------------------------------------------------------
  711. // node_stack 
  712. //------------------------------------------------------------------------------
  713.  
  714. class node_stack {
  715.  
  716. node head;
  717.  
  718. public:
  719.  
  720. node_stack() { head = nil; }
  721.  
  722. void push(node v) { v->data[1] = head; head = v; }
  723. node pop()        { node v = head; head = node(v->data[1]); return v; }
  724. bool empty()      { return (head==nil) ? true : false; }  
  725. void clear()      { head = nil; }  
  726.  
  727. };
  728.  
  729.  
  730. //------------------------------------------------------------------------------
  731. // node_queue 
  732. //------------------------------------------------------------------------------
  733.  
  734. class node_queue {
  735.  
  736. node head;
  737. node tail;
  738.  
  739. public:
  740.  
  741. node_queue() { head = nil; }
  742.  
  743. void append(node v) 
  744. { v->data[1] = nil; 
  745.   if (head == nil) 
  746.      head = v;
  747.   else
  748.      tail->data[1] = v; 
  749.   tail = v; 
  750.  }
  751.  
  752. node pop()   { node v = head; head = node(v->data[1]); return v; }
  753. bool empty() { return (head==nil) ? true : false; }  
  754. void clear() { head = nil; }  
  755.  
  756. };
  757.  
  758.  
  759.  
  760. //------------------------------------------------------------------------------
  761. // node_data 
  762. //------------------------------------------------------------------------------
  763.  
  764.  
  765. template <class T> class node_data {
  766.  
  767. public:
  768.  
  769. T& operator[](node v) { return (T&)v->data[2]; }
  770.  
  771. node_data(const graph& G, T x) { init_node_data2(G,GenPtr(x)); }
  772.  
  773. };
  774.  
  775.  
  776. class int_node_data {
  777.  
  778. public:
  779.  
  780. int& operator[](node v) { return (int&)v->data[2]; }
  781. int  operator()(node v) { return (int)v->data[2]; }
  782.  
  783. int  get(node v) { return (int)v->data[2]; }
  784. void set(node v,int i) { v->data[2] = GenPtr(i); }
  785.  
  786. int_node_data(const graph& G, int x) { init_node_data2(G,GenPtr(x)); }
  787.  
  788. };
  789.  
  790.  
  791.  
  792.  
  793.  
  794. //------------------------------------------------------------------------------
  795. // edge_data 
  796. //------------------------------------------------------------------------------
  797.  
  798.  
  799. template <class T> class edge_data {
  800.  
  801. public:
  802.  
  803. T& operator[](edge e) { return (T&)e->data[1]; }
  804.  
  805. edge_data(const graph& G, T x) { init_edge_data(G,1,GenPtr(x)); }
  806.  
  807. };
  808.  
  809.  
  810.  
  811.  
  812. //------------------------------------------------------------------------------
  813. // node and edge arrays
  814. //------------------------------------------------------------------------------
  815.  
  816.  
  817. #if defined(LEDA_CHECKING_OFF)
  818. #define GRAPH_ARRAY_ACCESS(I,type)\
  819. type& operator[](I x)       { return ACCESS(type,arr[index(x)]); }\
  820. type  operator[](I x) const { return ACCESS(type,arr[index(x)]); }
  821. #else
  822. #define GRAPH_ARRAY_ACCESS(I,type)\
  823. type& operator[](I x)       { return ACCESS(type,entry(x));}\
  824. type  operator[](I x) const { return ACCESS(type,inf(x));}
  825. #endif
  826.  
  827. //------------------------------------------------------------------------------
  828. // node arrays
  829. //------------------------------------------------------------------------------
  830.  
  831.  
  832.  
  833. template<class type>
  834.  
  835. class _CLASSTYPE node_array : public graph_array<node> {
  836.  
  837. type X;
  838.  
  839. void copy_entry(GenPtr& x) const { x=Copy(ACCESS(type,x));}
  840. void clear_entry(GenPtr& x)const { Clear(ACCESS(type,x)); }
  841.  
  842. public:
  843.  
  844. int cmp_entry(node x,node y) const 
  845. { return compare(ACCESS(type,arr[index(x)]),ACCESS(type,arr[index(y)])); }
  846.  
  847. GRAPH_ARRAY_ACCESS(node,type)
  848.  
  849. type& elem(int i)              { return ACCESS(type,arr[i]);}
  850. type  elem(int i) const        { return ACCESS(type,arr[i]);}
  851.  
  852. void  init(const graph& G, int n, type i) { graph_array<node>::init(G,n,Convert(i)); }
  853. void  init(const graph& G, type i)        { init(G,G.max_i(node(0))+1,i); }
  854. void  init(const graph& G)                { Init(X); init(G,X); }
  855. void  init(const node_array& A)           { graph_array<node>::init(A); }
  856.  
  857.  
  858. node_array() {}
  859. node_array(const graph& G)                 { init(G);   }
  860. node_array(const graph& G, int n, type i)  { init(G,n,i); }
  861. node_array(const graph& G, type i)         { init(G,i); }
  862. node_array(const node_array& A)            { init(A);   }
  863.  
  864. node_array& operator=(const node_array& A) { init(A); return *this;}
  865.  
  866. ~node_array() { graph_array<node>::clear(); }
  867.  
  868. };
  869.  
  870.  
  871. //------------------------------------------------------------------------------
  872. // edge arrays
  873. //------------------------------------------------------------------------------
  874.  
  875.  
  876. template<class type>
  877.  
  878. class _CLASSTYPE edge_array : public graph_array<edge> {
  879.  
  880. type X;
  881.  
  882. void copy_entry(GenPtr& x) const { x=Copy(ACCESS(type,x));}
  883. void clear_entry(GenPtr& x)const { Clear(ACCESS(type,x)); }
  884.  
  885. public:
  886.  
  887. int cmp_entry(edge x,edge y) const 
  888. { return compare(ACCESS(type,arr[index(x)]),ACCESS(type,arr[index(y)])); }
  889.  
  890. GRAPH_ARRAY_ACCESS(edge,type)
  891.  
  892. type& elem(int i)              { return ACCESS(type,arr[i]);}
  893. type  elem(int i) const        { return ACCESS(type,arr[i]);}
  894.  
  895. void  init(const graph& G, int n, type i) { graph_array<edge>::init(G,n,Convert(i)); }
  896. void  init(const graph& G, type i)        { init(G,G.max_i(edge(0))+1,i); }
  897. void  init(const graph& G)                { Init(X); init(G,X); }
  898. void  init(const edge_array& A)           { graph_array<edge>::init(A); }
  899.  
  900. edge_array() {}
  901. edge_array(const graph& G)                 { init(G);   }
  902. edge_array(const graph& G, int n, type i)  { init(G,n,i); }
  903. edge_array(const graph& G, type i)         { init(G,i); }
  904. edge_array(const edge_array& A)            { init(A);   }
  905.  
  906. edge_array& operator=(const edge_array& A) { init(A); return *this;}
  907.  
  908. ~edge_array() { graph_array<edge>::clear(); }
  909.  
  910. };
  911.  
  912.  
  913.  
  914.  
  915.  
  916. //-----------------------------------------------------------------------------
  917. // graph generators
  918. //-----------------------------------------------------------------------------
  919.  
  920. extern void complete_graph(graph&,int);
  921. extern void random_graph(graph&,int,int);
  922. extern void test_graph(graph&);
  923.  
  924. extern void complete_bigraph(graph&,int,int,list<node>&,list<node>&);
  925. extern void random_bigraph(graph&,int,int,int,list<node>&,list<node>&);
  926. extern void test_bigraph(graph&,list<node>&,list<node>&);
  927.  
  928.  
  929. extern void random_planar_graph(graph&,node_array<double>& xcoord, 
  930.                                        node_array<double>& ycoord, int n);
  931.  
  932. extern void random_planar_graph(graph&,int);
  933.  
  934.  
  935. extern void grid_graph(graph&,node_array<double>& xcoord, 
  936.                               node_array<double>& ycoord, int n);
  937.  
  938. extern void grid_graph(graph&,int);
  939.  
  940.  
  941. extern void cmdline_graph(graph&,int,char**);
  942.  
  943.  
  944.  
  945. //-----------------------------------------------------------------------------
  946. // miscellaneous  (should be members or constructors)
  947. //-----------------------------------------------------------------------------
  948.  
  949. extern bool Is_Bidirected(const graph&, edge_array<edge>&);
  950.  
  951. extern bool Is_Simple(graph& G);
  952.  
  953. extern void Make_Simple(graph& G);
  954.  
  955.  
  956.  
  957. // for historical reasons:
  958.  
  959. inline bool compute_correspondence(const graph& G, edge_array<edge>& rev)
  960. { return Is_Bidirected(G,rev); }
  961.  
  962. inline void eliminate_parallel_edges(graph& G) 
  963. { Make_Simple(G); }
  964.  
  965.  
  966. #endif
  967.